# -*- coding: utf-8 -*-
# @Author   : xiongjianwen
# @Time     : 2023/1/19 11:19
# @File     : handle_hanshu.py.py
# @Project  : BwProCost_Auto_v2

import uiautomation as auto

from commons.basePage import BaseControl

"""
客户端软件的函数封装类
"""


class HANSHU():
    def __init__(self, cilent_name='变电站工程.zwzj - 博微电力建设计价通软件', model_name='工程量'):
        self.app_windows = auto.WindowControl(Name=cilent_name,searchDepth=1)
        # self.inner_windows = self.getControl('WindowControl',self.app_windows,Name=model_name) # 基类封装的看上去比原生的更麻烦，暂时用原生的看看
        self.inner_windows = self.app_windows.WindowControl(Name=model_name)
        self.inner_tree = self.inner_windows.TreeControl()
        # self.inner_tree = self.getControl('TreeControl',self.inner_windows)

    def getColByTitle_byTree(self,title):
        """
        在树控件中，根据列头名称，获取列号
        :param title: 列头名称
        :return: 列号
        """
        table_pattern = self.inner_tree.GetPattern(auto.PatternId.TablePattern)
        title_dict = {}
        for i, x in enumerate(table_pattern.GetColumnHeaders()):
            title_dict[x.Name] = i
        return title_dict[title]

    def getColOfText_byTree(self,text):
        """
        在树类型控件中，根据文本名称获取列号，如：在工程量的消耗量界面，通过文本名称，获取列号
        :param text: 文本值
        :return: 列号，从0开始数
        """
        text_ctrl = self.inner_tree.TreeItemControl(Name=text) # text所在位置的控件对象
        text_pattern = text_ctrl.GetPattern(auto.PatternId.GridItemPattern)
        return text_pattern.Column

    def getRowOfText_byTree(self,text):
        """
        在树类型控件中，根据文本名称获取行号，如：在工程量的消耗量界面，通过文本名称，获取行号
        注：目前只能获取首次匹配到的文本，所在的行号，若有相同的文本则不获取后者的行号
        :param text: 文本值
        :return: 行号，从0开始数
        """
        text_ctrl = self.inner_tree.TreeItemControl(Name=text)  # text所在位置的控件对象
        text_pattern = text_ctrl.GetPattern(auto.PatternId.GridItemPattern)
        return text_pattern.Row

    def getValueOfText_byTree(self,text,title):
        """
        在树类型控件中，根据文本名称，以及列头的名称，获取所在单元格的值
        注：目前只能获取首次匹配到的文本，所在的行号，若有相同的文本则不获取后者的行号
        :param text: 控件的文本值
        :param title: 列头名称
        :return: 定位到的单元格文本值
        """
        try:
            text_row = self.getRowOfText_byTree(text=text) # 文本值所在的行号
            value_col = self.getColByTitle_byTree(title=title) # 要查询的值所在的列号
            value_ctrl_pattern = self.inner_tree.GetPattern(auto.PatternId.GridPattern)
            value_ctrl = value_ctrl_pattern.GetItem(text_row,value_col) # 要查询的值所在的控件对象
            return value_ctrl.Name if value_ctrl.Name else None
        except LookupError:
            pass

    def setValueOfText_byTree(self,text,title,value):
        """
        在树控件中，根据文本名称，以及列头名称，设置所在文本名称行、列头名称列的单元格的值
        :param text: 控件的文本值
        :param title: 列头名称
        :param value: 要设置的值
        :return:
        """
        text_row = self.getRowOfText_byTree(text=text)  # 文本值所在的行号
        value_col = self.getColByTitle_byTree(title=title)  # 要查询的值所在的列号
        value_ctrl_pattern = self.inner_tree.GetPattern(auto.PatternId.GridPattern)
        value_ctrl = value_ctrl_pattern.GetItem(text_row, value_col)  # 要查询的值所在的控件对象
        value_ctrl.DoubleClick()
        value_ctrl.SendKeys('{Ctrl}a'+value+'{Enter}')

    def getValueOfText_byData(self,text):
        """
        Table类型的控件中Data控件的获取，根据文本名称，获取其右侧的值，如工程信息界面获取工程名称的值
        :param text: 文本名称
        :return: 文本值
        """
        text_ctrl = self.inner_windows.DataItemControl(Name=text)
        text_value = text_ctrl.GetNextSiblingControl().Name
        return text_value if text_value else None

    def setValueOfText_byData(self,text,value):
        """
        Table类型的控件中Data控件的获取，根据文本名称，设置自其右侧的值
        :param text: 文本名称
        :param value: 设置的值
        :return:
        """
        text_ctrl = self.inner_windows.DataItemControl(Name=text)
        value_ctrl = text_ctrl.GetNextSiblingControl()
        value_ctrl.DoubleClick()
        value_ctrl.SendKeys(value+'{Enter}')

    def setItemOfText_byData(self,text,value):
        """
        Table类型的控件中Data控件，下拉设置值，根据文本名称，设置其右侧下拉框的值
        :param text: 文本名称
        :param value: 设置的下拉值
        :return:
        """
        text_ctrl = self.inner_windows.DataItemControl(Name=text)
        value_ctrl = text_ctrl.GetNextSiblingControl()
        value_ctrl.DoubleClick()
        value_ctrl.Click()
        value_list = auto.ListControl(ClassName='QComboBoxListView')
        item = value_list.ListItemControl(Name=value)
        item.Click()

    def right_key(self,text,keyname):
        '''
        右键功能，鼠标在text文本内容那里点击右键，并选择keyname
        :param text: 文本内容
        :param keyname: 右键的名称，有添加、添加子级、剪切、复制等
        :return:
        '''
        fymc_ctrl = self.inner_windows.TreeItemControl(Name=text)
        fymc_ctrl.RightClick()
        auto.MenuItemControl(Name=keyname).Click()

if __name__ == '__main__':
    hs = HANSHU(model_name='工程量')  # 类的实例化
    # print(hs.getColOfText_byTree('一般土建')) # 打印“一般土建”所在的列号
    # print(hs.getRowOfText_byTree('一般土建')) # 打印“一般土建”所在的行号
    # print(type(hs.getColByTitle_byTree('项目名称'))) # 打印“项目名称”这一列，所在的列号
    # print(hs.getValueOfText_byTree('600MW冷风道', '计算式')) # 打印“600MW冷风道”在计算式列的文本内容
    # hs.setValueOfText_byTree('照明', '单位','abc')
    # print(hs.getValueOfText_byData('人工费')) # 打印“人工费”右侧的值
    # print(hs.getValueOfText_byTree('建筑普通工','预算价不含税'))
    # hs.setValueOfText_byData('人工费','123') # 设置“人工费”的值为123
    # hs.setItemOfText_byData("预算类型","结算") # 设置预算类型右侧的下拉值为“结算”
    print(hs.getValueOfText_byData('人工费'))